﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyNganHangDe.DAL;
using QuanLyNganHangDe.DAL.Models;
using QuanLyNganHangDe.GUI.DuLieu;
using QuanLyNganHangDe.BLL;
using QuanLyNganHangDe.GUI.TacNghiep;


namespace QuanLyNganHangDe.GUI
{
    public partial class FormQuanLyNganHangCauHoi : FormBase
    {
        string strSoKhoicauHoi = "";
        string strSoCauHoiItNhatTrongKhoi = "";
        string strSoCauHoiNhieuNhatTrongKhoi = "";
        string strSoDeDaKhaiThac = "";

        public void SetReadOnlyGrid()
        {
            gridHocPhan.AllowUserToAddRows = false;
            gridHocPhan.AllowUserToDeleteRows = false;
            gridHocPhan.ReadOnly = true;
            gridHocPhan.AutoGenerateColumns = false;
            colHocPhan_MaHocPhan.DataPropertyName = "MaHocPhan";
            colHocPhan_TenHocPhan.DataPropertyName = "TenHocPhan";
            colHocPhan_SoTinChi.DataPropertyName = "SoTinChi";

            gridPhan.AllowUserToAddRows = false;
            gridPhan.AllowUserToDeleteRows = false;
            //gridPhan.ReadOnly = true;
            gridPhan.AutoGenerateColumns = false;
            //gridPhan.ColumnIndexToGroup = "0;3";

            colPhan_Phan.DataPropertyName = "TenKhoi";
            colTenCauHoi.DataPropertyName = "TenCauHoi";
            colPhan_NoiDung.DataPropertyName = "NoiDung";
            colPhan_Diem.DataPropertyName = "Diem";
            colPhan_SoLanDaDung.DataPropertyName = "SoLanDaDungStr";
        }
        bool allowUpdate = false;
        public FormQuanLyNganHangCauHoi()
        {
            InitializeComponent();
            if ((int)NguoiSuDung.VAITRO.QuanTriHeThong == Program.NguoiSuDung.VaiTro)
                btnCauHoi_KhoiPhuc.Visible = true;
            else
                btnCauHoi_KhoiPhuc.Visible = false;
            SetReadOnlyGrid();
            strSoKhoicauHoi = lbSoKhoiCauHoi.Text;
            strSoCauHoiItNhatTrongKhoi = lbSoCauHoiItNhatTrongKhoi.Text;
            strSoCauHoiNhieuNhatTrongKhoi = lbSoCauHoiNhieuNhatTrongKhoi.Text;
            strSoDeDaKhaiThac = lbSoDeThiDaKhaiThac.Text;
            NapDanhSachDonVi();
        }

        void NapDanhSachDonVi()
        {
            allowUpdate = false;
            var ls = BizDonViPhuTrach.GetListDonViPhuTrach();
            bsKhoa_BoMon.DataSource = ls;
            cbxKhoa_BoMon.DataSource = bsKhoa_BoMon;
            cbxKhoa_BoMon.DisplayMember = "TenDonVi";
            cbxKhoa_BoMon.ValueMember = "MaDonVi";
            if (ls != null && ls.Count > 0)
            {
                btnHocPhan_BoSung.Enabled = bntHocPhan_Import.Enabled = true;
            }
            else
            {
                btnHocPhan_BoSung.Enabled = bntHocPhan_Import.Enabled = false;
            }
            NapDanhSachHocPhan();
        }

        void NapDanhSachHocPhan()
        {
            var ls = BizHocPhan.GetListHocPhan(bsKhoa_BoMon.Current as DonViPhuTrach);
            bsHocPhan.DataSource = ls;
            gridHocPhan.DataSource = bsHocPhan;
            if (ls != null && ls.Count > 0)
            {
                btnChuyenHP.Enabled = btnHocPhan_NapLai.Enabled = btnHocPhan_Sua.Enabled = btnHocPhan_Xoa.Enabled = true;
                btnCauHoi_Import.Enabled = true;
            }
            else
            {
                btnChuyenHP.Enabled = btnHocPhan_NapLai.Enabled = btnHocPhan_Sua.Enabled = btnHocPhan_Xoa.Enabled = false;
                btnCauHoi_Import.Enabled = false;
            }
            lbHocPhan_ThongKe.Text = "Danh sách này có " + ls.Count + " học phần";
            NapDanhSachCauHoi();
        }

        void NapDanhSachCauHoi()
        {
            HocPhan hocPhan = bsHocPhan.Current as HocPhan;
            var lsCH = new List<GridCauHoiForQuanLy>();
            FormProgress fr = new FormProgress();
            if (hocPhan != null)
            {
                btnThem.Enabled = true;
                fr.DoWork += (oSender, oE) =>
                {
                    lsCH = BizCauHoi.GetListCauHoi(hocPhan, Program.NguoiSuDung.VaiTro);
                };
                fr.RunWorkerCompleted += (oSender, oE) =>
                {
                    bsPhan.DataSource = lsCH;
                    gridPhan.DataSource = bsPhan;

                    if (lsCH != null && lsCH.Count > 0)
                    {
                        btnCauHoi_NapLai.Enabled = btnCauHoi_ChinhSua.Enabled = btnCauHoi_ChuyenKhoi.Enabled = btnCauHoi_KhoiPhuc.Enabled = btnCauHoi_Xoa.Enabled = true;
                    }
                    else
                        btnCauHoi_NapLai.Enabled = btnCauHoi_ChinhSua.Enabled = btnCauHoi_ChuyenKhoi.Enabled = btnCauHoi_KhoiPhuc.Enabled = btnCauHoi_Xoa.Enabled = false;
                    NapThongTinChiTietHocPhan(hocPhan);
                    allowUpdate = true;
                    lbPhan_ThongKe.Text = string.Format("Danh sách có {0} câu hỏi", bsPhan.Count);
                };
                fr.StartWorking(this);
            }
            else
            {
                btnThem.Enabled = false;
                NapThongTinChiTietHocPhan(null);
                bsPhan.DataSource = null;
                gridPhan.DataSource = bsPhan;
                lbHocPhan_ThongKe.Text = "";
            }

        }

        void NapThongTinChiTietHocPhan(HocPhan hp)
        {
            if (hp != null)
            {
                lbTieuDeHP.Text = string.Format("[{0}]{1} ({2} tín chỉ)", hp.MaHocPhan, hp.TenHocPhan, hp.SoTinChi);
                var thongTinChiTiet = BizHocPhan.ThongTinChiTiet(hp, Program.NguoiSuDung.VaiTro);
                if (thongTinChiTiet != null)
                {
                    lbSoKhoiCauHoi.Text = strSoKhoicauHoi + " " + thongTinChiTiet[0];
                    lbSoCauHoiItNhatTrongKhoi.Text = strSoCauHoiItNhatTrongKhoi + " " + thongTinChiTiet[1];
                    lbSoCauHoiNhieuNhatTrongKhoi.Text = strSoCauHoiNhieuNhatTrongKhoi + " " + thongTinChiTiet[2];
                    lbSoDeThiDaKhaiThac.Text = strSoDeDaKhaiThac + " " + thongTinChiTiet[3];
                }
            }
            else
            {
                lbSoKhoiCauHoi.Text = strSoKhoicauHoi;
                lbSoCauHoiItNhatTrongKhoi.Text = strSoCauHoiItNhatTrongKhoi;
                lbSoCauHoiNhieuNhatTrongKhoi.Text = strSoCauHoiNhieuNhatTrongKhoi;
                lbSoDeThiDaKhaiThac.Text = strSoDeDaKhaiThac;
            }
        }

        private void OnLoad(object sender, EventArgs e)
        {

        }



        private void toolImportNganHangDe_Click(object sender, EventArgs e)
        {
            DonViPhuTrach donvi = bsKhoa_BoMon.Current as DonViPhuTrach;
            HocPhan hocPhan = bsHocPhan.Current as HocPhan;
            if (donvi != null && hocPhan != null)
            {
                FormNganHangCauHoi_Import fr = new FormNganHangCauHoi_Import(donvi, hocPhan);
                fr.ShowDialog();
                NapDanhSachCauHoi();
            }
        }

        private void btnLop_BoSung_Click(object sender, EventArgs e)
        {
            var donvi = bsKhoa_BoMon.Current as DonViPhuTrach;
            if (donvi != null)
            {
                FormHocPhan_Details frm = new FormHocPhan_Details(true, new HocPhan() { MaDonVi = donvi.MaDonVi });
                frm.ShowDialog();
                NapDanhSachHocPhan();
            }
        }

        private void btnLop_Sua_Click(object sender, EventArgs e)
        {
            HocPhan hp = bsHocPhan.Current as HocPhan;
            if (hp != null)
            {
                FormHocPhan_Details frm = new FormHocPhan_Details(false, hp);
                frm.ShowDialog();
                NapDanhSachHocPhan();
            }
        }

        private void btnLop_Xoa_Click(object sender, EventArgs e)
        {
            HocPhan hp = bsHocPhan.Current as HocPhan;
            if (hp != null)
            {
                if (MessageBox.Show("Bạn có chắc muốn xóa học phần " + hp.TenHocPhan + "\r\n" +
                    "Lưu ý: Ngân hàng đề, ngân hàng câu hỏi của học phần cũng sẽ bị xóa", "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
                    if (BizHocPhan.Delete(hp))
                    {
                        MessageBox.Show("Xóa thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        NapDanhSachHocPhan();
                    }
                    else
                        MessageBox.Show("Không thể xóa học phần này", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void mnuLoaiHinh_BoSung_Click(object sender, EventArgs e)
        {
            DonViPhuTrach donvi = new DonViPhuTrach();
            FormDonViPhuTrach_Detail form = new FormDonViPhuTrach_Detail(true, donvi);
            form.ShowDialog();
            NapDanhSachDonVi();
        }

        private void menuDonVi_Sua_Click(object sender, EventArgs e)
        {
            var donvi = bsKhoa_BoMon.Current as DonViPhuTrach;
            if (donvi != null)
            {
                FormDonViPhuTrach_Detail form = new FormDonViPhuTrach_Detail(false, donvi);
                form.ShowDialog();
                NapDanhSachDonVi();
            }
            else
                MessageBox.Show("Không tồn tại Khoa/Bộ môn nào cả", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void menuDonVi_Xoa_Click(object sender, EventArgs e)
        {

            var donvi = bsKhoa_BoMon.Current as DonViPhuTrach;
            if (donvi != null)
            {
                if (MessageBox.Show("Bạn có chắc muốn xóa Khoa/Bộ môn " + donvi.TenDonVi, "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
                {
                    if (BizDonViPhuTrach.Delete(donvi))
                    {
                        MessageBox.Show("Xóa thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        NapDanhSachDonVi();
                    }
                    else
                        MessageBox.Show("Bạn không thể xóa Khoa/Bộ môn " + donvi.TenDonVi, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
                MessageBox.Show("Không tồn tại Khoa/Bộ môn nào cả", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void cbxKhoa_BoMon_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void bsKhoa_BoMon_CurrentChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
                NapDanhSachHocPhan();
        }

        private void bsHocPhan_CurrentChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
                NapDanhSachCauHoi();
        }

        private void btnCauHoi_Xoa_Click(object sender, EventArgs e)
        {
            gridPhan.EndEdit();
            var lsCauHoi = bsPhan.DataSource as List<GridCauHoiForQuanLy>;
            if (lsCauHoi != null && lsCauHoi.Count() > 0)
            {
                var selected = lsCauHoi.Where(t => t.IsSeclected == true).Count();
                if (selected == 0)
                {
                    DialogUtils.ShowMessage("Vui lòng đánh dấu câu hỏi bạn muốn xóa");
                    return;
                }
                if (DialogResult.OK == MessageBox.Show("Bạn có chắc là muốn xóa những câu hỏi được chọn\r\n" +
                    "Lưu ý: Những đề đã sử dụng câu hỏi này cũng sẽ bị xóa", "Chú ý", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning))
                {
                    var strThongBao = "";
                    foreach (var ch in lsCauHoi)
                    {
                        if (ch.IsSeclected)
                        {
                            var rs = BizCauHoi.XoaCauHoi(ch.MaCauHoi);
                            if (rs == 1)
                                strThongBao += ch.TenCauHoi + " đã xóa thành công" + "\r\n";
                            else if (rs == -1)
                                strThongBao += ch.TenCauHoi + " không xóa được (Đã được sử dụng)" + "\r\n";
                            else
                                strThongBao += ch.TenCauHoi + " không tồn tại" + "\r\n";
                        }
                    }
                    DialogUtils.ShowMessage(strThongBao);
                    NapDanhSachCauHoi();
                }
            }
        }

        private void gridPhan_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {

        }

        private void btnKhoiPhuc_Click(object sender, EventArgs e)
        {
            gridPhan.EndEdit();
            var lsCauHoi = bsPhan.DataSource as List<GridCauHoiForQuanLy>;
            if (lsCauHoi != null && lsCauHoi.Count() > 0)
            {
                var seleted = lsCauHoi.Where(t => t.IsSeclected == true).Count();
                if (seleted == 0)
                {
                    DialogUtils.ShowMessage("Vui lòng chọn câu hỏi muốn khôi phục");
                    return;
                }
                var strThongBao = "";
                foreach (var ch in lsCauHoi)
                {
                    if (ch.IsSeclected)
                    {

                        if (BizCauHoi.PhucHoi(ch.MaCauHoi))
                            strThongBao += ch.TenCauHoi + " đã khôi phục thành công\r\n";
                        else
                            strThongBao += ch.TenCauHoi + " khôi phục không thành công\r\n";
                    }
                }
                DialogUtils.ShowMessage(strThongBao);
            }
        }

        private void lnkQuanLyKhoaBoMon_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            FormKhoaBoMon frm = new FormKhoaBoMon();
            frm.ShowDialog();
            NapDanhSachDonVi();
        }

        private void gridPhan_MouseLeave(object sender, EventArgs e)
        {

        }

        private void gridPhan_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == colTenCauHoi.Index)
            {
                var rowIndex = e.RowIndex;
                bsPhan.Position = rowIndex;

                var ch = bsPhan.Current as GridCauHoiForQuanLy;
                if (ch != null)
                {
                    FormTooltip frm = new FormTooltip(ch.MaCauHoi, ch.NoiDung_RTF, ch.DapAn_RTF);
                    frm.StartPosition = FormStartPosition.CenterParent;
                    if (frm.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                        NapDanhSachCauHoi();
                }
            }
        }

        private void gridPhan_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Delete)
            {
                btnCauHoi_Xoa.PerformClick();

            }
            else if (e.KeyChar == (char)Keys.Z || e.KeyChar == 122)
            {
                btnCauHoi_KhoiPhuc.PerformClick();

            }
        }

        private void btnCauHoi_Import_Click(object sender, EventArgs e)
        {
            DonViPhuTrach donvi = bsKhoa_BoMon.Current as DonViPhuTrach;
            HocPhan hocPhan = bsHocPhan.Current as HocPhan;
            if (donvi != null && hocPhan != null)
            {
                FormNganHangCauHoi_Import fr = new FormNganHangCauHoi_Import(donvi, hocPhan);
                if (fr.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    NapDanhSachCauHoi();
            }
        }

        private void btnCauHoi_ChuyenKhoi_Click(object sender, EventArgs e)
        {
            var ch = bsPhan.Current as GridCauHoiForQuanLy;
            if (ch == null)
                return;
            FormChuyenKhoi form = new FormChuyenKhoi(ch.MaCauHoi);
            if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NapDanhSachCauHoi();
            }
        }

        private void btnCauHoi_NapLai_Click(object sender, EventArgs e)
        {
            NapDanhSachCauHoi();
        }

        private void btnCauHoi_ChinhSua_Click(object sender, EventArgs e)
        {
            var ch = bsPhan.Current as GridCauHoiForQuanLy;
            if (ch == null)
                return;
            FromCauHoi_EditTitle form = new FromCauHoi_EditTitle(ch.MaCauHoi, ch.TenCauHoi, ch.Diem, ch.TenKhoi);
            if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NapDanhSachCauHoi();
            }
        }

        private void bntHocPhan_Import_Click(object sender, EventArgs e)
        {
            FormHocPhan_Import form = new FormHocPhan_Import();
            form.ShowDialog();
            NapDanhSachDonVi();
        }

        private void btnChuyenHP_Click(object sender, EventArgs e)
        {
            if ((bsHocPhan.Current as HocPhan) != null)
            {
                FormChuyenHocPhan frm = new FormChuyenHocPhan(bsHocPhan.Current as HocPhan);
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    NapDanhSachCauHoi();
            }
        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            HocPhan hp = bsHocPhan.Current as HocPhan;
            if (hp != null)
            {
                FormThemCauHoi frm = new FormThemCauHoi(hp);
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    NapDanhSachCauHoi();
            }
        }
    }
}